<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <script>
    function fn(name) {
        console.log(name);
        
    }
    //
    fn(123);
    fn('字符串');
    fn(true);
    fn([1,2,3,4,5]);

    fn({name:'刘德华'});

    //函数是 复杂数据类型 函数也属于对象
    fn(function(){})

    var fun = function(){}

    fn(fun);

    //函数 可以作为 对象的 属性值(称之为 对象的方法)
    var o = {
        sayHi:function() {
            console.log('hell');
            
        }
    }

    //闭包: 是为了是外部作用域 能够访问 累不作用域的 方式
    //return: 没办法满足每次访问函数内部的数据都是同一个
    function foo() {
        var a = 10;
        var b = Math.random();
        return b;
    }
    var num = foo();
    console.log(num);

    var num1 = foo();
    console.log(num1);


    //闭包的基本格式
    function foo1() {
        var a = 10;
        var b = Math.random();

        return function fn1() {
            return b;
        }
        //return fn1
    }
    //foo1()();

    var numberFn = foo1(); //执行一次

    var number1 = numberFn();
    var number2 = numberFn();

    console.log(number1);
    console.log(number2);



    //结论 闭包可以保证 外部作用域 每次访问函数内部的 数据都是同一个数据:
    //弊端: 闭包内部的数据 会被长期持有不会释放 除非当前执行文件关闭
    
    
    
    
    </script>
</body>
</html>